/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fbv.tcc.chart;

import fbv.tcc.classes.PontoRadiacao;
import fbv.tcc.utils.PropertiesGenerator;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 *
 * @author Casa
 */
public class GraficoRadiacao {

    public ArrayList<PontoRadiacao> planilha = new ArrayList<PontoRadiacao>();
    public ArrayList<PontoRadiacao> modelo = new ArrayList<PontoRadiacao>();

    public double calcularNascerSol(PontoRadiacao pt) throws FileNotFoundException, IOException {

        Properties res = PropertiesGenerator.carregarProperties();

        double latitudeOficial = Double.parseDouble(res.getProperty("latitudeOficialLocalidade"));
        double latitude = Double.parseDouble(res.getProperty("latitude"));
        double longitude = Double.parseDouble(res.getProperty("longitude"));
        int diaJuliano = pt.getTimeStamp().getDayOfYear();

        double alfa = 23.45 * Math.sin(Math.toRadians(0.98630 * (284 + diaJuliano))); //ok

        double tanLat = Math.tan(Math.toRadians(latitude)); //ok
        double tanAlfa = Math.tan(Math.toRadians(alfa)); //ok

        double Td = Math.toDegrees(0.1334 * (Math.acos((-1) * tanLat * tanAlfa)));

        double horaNascerSol = 12 - (Td / 2);

        double correcaoLongitude = Math.abs(longitude) - latitudeOficial;

        double xHora = correcaoLongitude / 15;

        double horaNascerSolCorrigida;

        if (Math.abs(longitude) < latitudeOficial) {
            horaNascerSolCorrigida = horaNascerSol + xHora;
        } else {
            horaNascerSolCorrigida = horaNascerSol - xHora;
        }

        return horaNascerSolCorrigida;

    }

    public double calcularPorSol(PontoRadiacao pt) throws FileNotFoundException, IOException {

        Properties res = PropertiesGenerator.carregarProperties();

        double latitudeOficial = Double.parseDouble(res.getProperty("latitudeOficialLocalidade"));
        double latitude = Double.parseDouble(res.getProperty("latitude"));
        double longitude = Double.parseDouble(res.getProperty("longitude"));
        int diaJuliano = pt.getTimeStamp().getDayOfYear();

        double alfa = 23.45 * Math.sin(Math.toRadians(0.98630 * (284 + diaJuliano))); //ok

        double tanLat = Math.tan(Math.toRadians(latitude)); //ok
        double tanAlfa = Math.tan(Math.toRadians(alfa)); //ok

        double Td = Math.toDegrees(0.1334 * (Math.acos((-1) * tanLat * tanAlfa)));

        double horaPorSol = 12 + (Td / 2);

        double correcaoLongitude = Math.abs(longitude) - latitudeOficial;

        double xHora = correcaoLongitude / 15;

        double horaPorSolCorrigida;

        if (Math.abs(longitude) < latitudeOficial) {
            horaPorSolCorrigida = horaPorSol + xHora;
        } else {
            horaPorSolCorrigida = horaPorSol - xHora;
        }

        return horaPorSolCorrigida;

    }

    public int retornaPosInicio(double horaNascerSol, ArrayList<PontoRadiacao> planilha) {

        int inicioX = 0;
        int i = 0;


        while (planilha.get(i).toHour() < horaNascerSol) {
            inicioX = i;
            i++;
        }

        return inicioX;
    }

    public void separarPontoRadiacao(ArrayList<PontoRadiacao> planilha, ArrayList<PontoRadiacao> modeloFisico) throws IOException {


        //lista que contem as datas separadas e que será armazenada no hashmap para cada dia juliano
        ArrayList<PontoRadiacao> planilhaSeparados = new ArrayList<PontoRadiacao>();
        ArrayList<PontoRadiacao> modeloSeparados = new ArrayList<PontoRadiacao>();

        //lista contendo as datas completas visitadas
        ArrayList<PontoRadiacao> planilhaVisitados = new ArrayList<PontoRadiacao>();

        //lista contendo os dias julianos que já visitei
        ArrayList<Integer> diaJulianoVisitado = new ArrayList<Integer>();

        int diaJulianoCorrente;

        for (int i = 0; i < planilha.size(); i++) {

            //se o dia ainda não foi visitado...            
            if (!planilhaVisitados.contains(planilha.get(i))) {

                //adiciona o dia Juliano atual para a lista de visitados
                diaJulianoCorrente = planilha.get(i).getTimeStamp().dayOfYear().get();
                diaJulianoVisitado.add(diaJulianoCorrente);

                //System.out.println("DiaJ: " + diaJulianoCorrente);

                for (int j = 0; j < planilha.size(); j++) {


                    if (!planilhaVisitados.contains(planilha.get(j))) {

                        // se o dia juliano atual existe na lista de visitados..
                        if (diaJulianoVisitado.contains(planilha.get(j).getTimeStamp().dayOfYear().get())) {


                            //adiciona aqui ponto a ponto na lista
                            planilhaSeparados.add(planilha.get(j));
                            modeloSeparados.add(modeloFisico.get(j));

                            //exportarDadosXLS(diaJulianoCorrente, planilha.get(j), modeloFisico.get(j), xlsExport);

                            //marca esse ponto como visitado
                            planilhaVisitados.add(planilha.get(j));

                            //System.out.println(modeloFisico.get(j).getRadiacao() + " - " + modeloFisico.get(j).getTimeStamp());

                        } else {
                            continue;
                        }
                    } else {
                        continue;
                    }
                }

                renderizarGraficoPasta(planilhaSeparados, modeloSeparados);


                planilhaSeparados.clear();
                modeloSeparados.clear();

            }

        }

    }

    public void renderizarGraficoPasta(ArrayList<PontoRadiacao> seriePlanilha, ArrayList<PontoRadiacao> serieModeloFisico) throws FileNotFoundException, IOException {

        Properties res = PropertiesGenerator.carregarProperties();
        String caminhoGraficos = res.getProperty("caminhoGrafico");


        //serie com radiações da planilha
        XYSeries series1 = new XYSeries("Medido");
        XYSeries series2 = new XYSeries("Céu Claro");

        double horaNascerSol = calcularNascerSol(seriePlanilha.get(0));
        int indice = retornaPosInicio(horaNascerSol, seriePlanilha);



        for (int i = 0; i < serieModeloFisico.size(); i++) {

            double radiacaoPlanilha = seriePlanilha.get(i).getRadiacao();
            double radiacaoModeloFisico = serieModeloFisico.get(i).getRadiacao();

            if (radiacaoModeloFisico > 0) {
                series2.add(indice, radiacaoModeloFisico);
                //modelo.add(serieModeloFisico.get(indice));
                indice++;
            }

            if (radiacaoPlanilha != 0) {
                series1.add(i, radiacaoPlanilha);
                //planilha.add(seriePlanilha.get(i));
            }



        }

        XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);
        dataset.addSeries(series2);
        dataset.setAutoWidth(true);


        JFreeChart chart = ChartFactory.createXYLineChart(
                "Irradiância Solar Total " + seriePlanilha.get(0).getTimeStamp().toString("dd/MM/yyyy"), // Title
                "Tempo", // x-axis Label
                "Radiação", // y-axis Label
                dataset, // Dataset
                PlotOrientation.VERTICAL, // Plot Orientation
                true, // Show Legend
                true, // Use tooltips
                false // Configure chart to generate URLs?
                );

        try {
            ChartUtilities.saveChartAsJPEG(new File(caminhoGraficos + "\\" + seriePlanilha.get(0).getTimeStamp().year().getAsString() + seriePlanilha.get(0).getTimeStamp().dayOfYear().getAsString() + ".jpg"), chart, 800, 300);
        } catch (IOException e) {
            System.err.println(e.toString());
        }
    }

    public void renderizarGraficoBarra() throws FileNotFoundException, IOException {

        Properties res = PropertiesGenerator.carregarProperties();
        String caminhoGraficos = res.getProperty("caminhoGrafico");

        // Create a simple Bar chart
        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
        dataset.setValue(6, "Profit", "Jane");
        dataset.setValue(7, "Profit", "Tom");
        dataset.setValue(8, "Profit", "Jill");
        dataset.setValue(5, "Profit", "John");
        dataset.setValue(12, "Profit", "Fred");

        JFreeChart chart = ChartFactory.createBarChart("Comparison between Salesman",
                "Salesman", "Profit", dataset, PlotOrientation.VERTICAL,
                false, true, false);

        try {
            ChartUtilities.saveChartAsJPEG(new File(caminhoGraficos + "\\" + "barra.jpg"), chart, 500, 300);
        } catch (IOException e) {
            System.err.println("Problem occurred creating chart.");
        }
    }

    public void exportarDadosXLS(ArrayList<PontoRadiacao> ptPlanilha, ArrayList<PontoRadiacao> ptModeloFisico) throws IOException, WriteException {

        Properties res = PropertiesGenerator.carregarProperties();
        String caminhoGraficos = res.getProperty("caminhoGrafico");

        ArrayList<Double> modelo = new ArrayList<Double>();
        ArrayList<Double> planilha = new ArrayList<Double>();

        double horaNascerSol = calcularNascerSol(ptPlanilha.get(0));
        int indice = retornaPosInicio(horaNascerSol, ptPlanilha);

        for (int i = 0; i < ptModeloFisico.size(); i++) {

            double radiacaoPlanilha = ptPlanilha.get(i).getRadiacao();
            double radiacaoModeloFisico = ptModeloFisico.get(i).getRadiacao();

            if (radiacaoModeloFisico > 0) {
                modelo.add(indice, radiacaoModeloFisico);
                indice++;
            }

            if (radiacaoPlanilha != 0) {
                planilha.add(i, radiacaoPlanilha);
            }
        }
        
        System.out.println("Modelo:"+modelo.size());
        System.out.println("Planilha:"+planilha.size());

    }
}